# 高阶继承与多态机制示例
# 通过多功能打印机的例子来展示多重继承和super()的使用


class Printer:
    """打印机类：实现基本的打印功能"""

    def __init__(self, model):
        self.model = model
        self.type = "打印机"
        print(f"初始化 {self.type} {self.model}")

    def print_document(self, document):
        print(f"使用 {self.model} 打印文档: {document}")


class Scanner:
    """扫描仪类：实现基本的扫描功能"""

    def __init__(self, model):
        self.model = model
        self.type = "扫描仪"
        print(f"初始化 {self.type} {self.model}")

    def scan_document(self):
        print(f"使用 {self.model} 扫描文档")
        return "扫描完成的文档内容"


class Fax:
    """传真机类：实现基本的传真功能"""

    def __init__(self, model):
        self.model = model
        self.type = "传真机"
        print(f"初始化 {self.type} {self.model}")

    def fax_document(self, document, recipient):
        print(f"使用 {self.model} 发送传真文档 {document} 到 {recipient}")


class MultiFunctionDevice(Printer, Scanner, Fax):
    """多功能一体机：继承打印机、扫描仪和传真机的功能"""

    def __init__(self, model):
        # 使用super()调用父类的初始化方法
        # 在多重继承中，super()会按照方法解析顺序(MRO)调用父类方法
        super().__init__(model)
        # 如果这里我们想指定调用的是Fax类的初始化方法，可以这样写：
        # Fax.__init__(self, model)
        self.type = "多功能一体机"

    def copy_document(self):
        """复印文档：组合扫描和打印功能"""
        # 调用父类的方法来实现复印功能
        content = self.scan_document()  # 调用Scanner类的方法
        self.print_document(content)  # 调用Printer类的方法

    def fax_scan(self, recipient):
        """扫描并传真：组合扫描和传真功能"""
        content = self.scan_document()  # 调用Scanner类的方法
        self.fax_document(content, recipient)  # 调用Fax类的方法


# 测试代码
if __name__ == "__main__":
    # 创建多功能一体机实例
    mfd = MultiFunctionDevice("HP-123")

    # 查看类的方法解析顺序(MRO)
    print(
        "\n类的方法解析顺序（按照从前到后的顺序，如果前一个对象找到了这个方法，就直接用了，就不会用后面的对象的方法了）:"
    )
    print(MultiFunctionDevice.__mro__)

    print("\n测试多功能一体机的功能:")
    # 测试打印功能（继承自Printer类）
    mfd.print_document("测试文档1")

    # 测试扫描功能（继承自Scanner类）
    mfd.scan_document()

    # 测试传真功能（继承自Fax类）
    mfd.fax_document("测试文档2", "张三")

    # 测试组合功能
    print("\n测试组合功能:")
    mfd.copy_document()  # 复印 = 扫描 + 打印
    mfd.fax_scan("李四")  # 扫描并传真 = 扫描 + 传真
